return inside;
}
+static gboolean
+range_is_in_ellipsis (GtkLabel *label,
+ gint start,
+ gint end)
+{
+ GtkLabelPrivate *priv = label->priv;
+ PangoLayoutIter *iter;
+ gboolean in_ellipsis;
+
+ if (!priv->ellipsize)
+ return FALSE;
+
+ gtk_label_ensure_layout (label);
+
+ if (!pango_layout_is_ellipsized (priv->layout))
+ return FALSE;
+
+ iter = pango_layout_get_iter (priv->layout);
+
+ in_ellipsis = FALSE;
+
+ do {
+ PangoLayoutRun *run;
+
+ run = pango_layout_iter_get_run_readonly (iter);
+ if (run)
+ {
+ PangoItem *item;
+
+ item = ((PangoGlyphItem*)run)->item;
+
+ if (item->offset <= start && end <= item->offset + item->length)
+ {
+ if (item->analysis.flags & PANGO_ANALYSIS_FLAG_IS_ELLIPSIS)
+ in_ellipsis = TRUE;
+ break;
+ }
+ else if (item->offset + item->length >= end)
+ break;
+ }
+ } while (pango_layout_iter_next_run (iter));
+
+ pango_layout_iter_free (iter);
+
+ return in_ellipsis;
+}
+
static void
gtk_label_select_word (GtkLabel *label)
{
GtkLabelPrivate *priv = label->priv;
gboolean select_on_focus;
GtkLabelLink *link;
+ GList *l;
if (priv->select_info == NULL)
return;
{
if (priv->select_info->links && !priv->in_click)
{
- link = priv->select_info->links->data;
- priv->select_info->selection_anchor = link->start;
- priv->select_info->selection_end = link->start;
- _gtk_label_accessible_focus_link_changed (label);
+ for (l = priv->select_info->links; l; l = l->next)
+ {
+ link = l->data;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ {
+ priv->select_info->selection_anchor = link->start;
+ priv->select_info->selection_end = link->start;
+ _gtk_label_accessible_focus_link_changed (label);
+ break;
+ }
+ }
}
}
}
focus_link = gtk_label_get_focus_link (label);
if (focus_link && direction == GTK_DIR_TAB_BACKWARD)
{
- l = g_list_last (info->links);
- focus_link = l->data;
- info->selection_anchor = focus_link->start;
- info->selection_end = focus_link->start;
- _gtk_label_accessible_focus_link_changed (label);
+ for (l = g_list_last (info->links); l; l = l->prev)
+ {
+ focus_link = l->data;
+ if (!range_is_in_ellipsis (label, focus_link->start, focus_link->end))
+ {
+ info->selection_anchor = focus_link->start;
+ info->selection_end = focus_link->start;
+ _gtk_label_accessible_focus_link_changed (label);
+ }
+ }
}
}
if (link->start > index)
{
- gtk_label_select_region_index (label, link->start, link->start);
- _gtk_label_accessible_focus_link_changed (label);
- return TRUE;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ {
+ gtk_label_select_region_index (label, link->start, link->start);
+ _gtk_label_accessible_focus_link_changed (label);
+ return TRUE;
+ }
}
}
else if (direction == GTK_DIR_TAB_BACKWARD)
if (link->end < index)
{
- gtk_label_select_region_index (label, link->start, link->start);
- _gtk_label_accessible_focus_link_changed (label);
- return TRUE;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ {
+ gtk_label_select_region_index (label, link->start, link->start);
+ _gtk_label_accessible_focus_link_changed (label);
+ return TRUE;
+ }
}
}
}
else
l = info->links;
+ for (; l; l = l->next)
+ {
+ GtkLabelLink *link = l->data;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ break;
+ }
break;
case GTK_DIR_TAB_BACKWARD:
}
else
l = g_list_last (info->links);
+ for (; l; l = l->prev)
+ {
+ GtkLabelLink *link = l->data;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ break;
+ }
break;
default:
link = l->data;
if (index >= link->start && index <= link->end)
{
- found = TRUE;
+ if (!range_is_in_ellipsis (label, link->start, link->end))
+ found = TRUE;
break;
}
}